/*
 * Copyright 2007,2008 Anton Dignoes, Daniel Rampanelli, Martin Palma
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.googlecode.webduff;

import java.lang.reflect.Constructor;

import javax.servlet.ServletContext;


import org.apache.commons.configuration.Configuration;

import com.googlecode.webduff.io.URI;

public class WebDuffConfiguration {
	
	private static final long serialVersionUID = 4516605399457338262L;
	
	private ServletContext theContext;
	
	private Configuration theConfiguration;

	public WebDuffConfiguration(ServletContext servletContext, Configuration configuration) {
		theContext = servletContext;
		theConfiguration = configuration;
	}
	
	public ServletContext getContext() {
		return theContext;
	}

	public Configuration getConf() {
		return theConfiguration;
	}
	
	public WebDuffConfiguration subset(String subset) {
		return new WebDuffConfiguration(getContext(), theConfiguration.subset(subset));
	}
	
	public URI getPath(String element) {
		URI prefixURI = new URI();
		String pathToElementContent = element;
		
		if(getConf().getProperty(element + ".context-relative") != null) {
			pathToElementContent = element + ".context-relative";
			prefixURI = new URI(getContext().getRealPath(""), System.getProperty("file.separator"));
		}

		return prefixURI.append(new URI(getConf().getString(pathToElementContent), URI.DEFAULT_SEPARATOR));
	}

	@SuppressWarnings("unchecked")
	public <T extends Configurable> T getConfigurableComponent(WebDuffConfiguration componentConf) {
		T component = null;
		try {
			Class<?> theClass = WebDuffConfiguration.class.getClassLoader().loadClass(componentConf.getConf().getString("class"));
			Constructor<?> aConstructor = theClass.getConstructor();
			component = (T) aConstructor.newInstance();
			component.init(componentConf);
		} catch (Exception e) {
			//log.fatal("Some problem making component (" + configurationSubset + ")", e);
			throw new RuntimeException("Some problem making component", e);
		}
		return component;
	}
	
}